home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / glibmm-2.4 / proc / m4 / class_interface.m4 < prev    next >
M4 Source File  |  2006-04-20  |  6KB  |  252 lines

  1. dnl $Id: class_interface.m4,v 1.5 2003/12/14 11:53:04 murrayc Exp $
  2.  
  3.  
  4. define(`_CLASS_INTERFACE',`dnl
  5. _PUSH()
  6. dnl
  7. dnl  Define the args for later macros
  8. define(`__CPPNAME__',`$1')
  9. define(`__CNAME__',`$2')
  10. define(`__CCAST__',`$3')
  11. define(`__CCLASS__',`$4') dnl SomethingIface or SomethingClass, both suffixes are used.
  12. define(`__BASE__',_LOWER(__CPPNAME__))
  13. define(`__CPPPARENT__',`Glib::Interface')
  14. dnl define(`__CPARENT__',`GObject')
  15. define(`__PCAST__',`(GObject*)')
  16. define(`__BOOL_IS_INTERFACE__',`1')
  17.  
  18.  
  19. _POP()
  20. _SECTION(SECTION_CLASS2)
  21. ') dnl end of _CLASS_INTERFACE
  22.  
  23.  
  24. dnl Some of the Gdk types are actually direct typedefs of their base type.
  25. dnl This means that 2 wrap functions would have the same argument.
  26. dnl define(`_NO_WRAP_FUNCTION',`dnl
  27. dnl _PUSH()
  28. dnl Define this macro to be tested for later.
  29. dnl define(`__BOOL_NO_WRAP_FUNCTION__',`$1')
  30. dnl _POP()
  31. dnl ')
  32.  
  33. dnl
  34. dnl
  35. dnl
  36. define(`_PH_CLASS_DECLARATION_INTERFACE',`dnl
  37. class __CPPNAME__`'_Class : public Glib::Interface_Class
  38. {
  39. public:
  40.   typedef __CPPNAME__ CppObjectType;
  41.   typedef __CNAME__ BaseObjectType;
  42.   typedef __CCLASS__ BaseClassType;
  43.   typedef __CPPPARENT__`'_Class CppClassParent;
  44.  
  45.   friend class __CPPNAME__;
  46.  
  47.   const Glib::Interface_Class& init();
  48.  
  49.   static void iface_init_function(void* g_iface, void* iface_data);
  50.  
  51.   static Glib::ObjectBase* wrap_new(GObject*);
  52.  
  53. protected:
  54.  
  55.   //Callbacks (default signal handlers):
  56.   //These will call the *_impl member methods, which will then call the existing default signal callbacks, if any.
  57.   //You could prevent the original default signal handlers being called by overriding the *_impl method.
  58. _IMPORT(SECTION_PH_DEFAULT_SIGNAL_HANDLERS)
  59.  
  60.   //Callbacks (virtual functions):
  61. _IMPORT(SECTION_PH_VFUNCS)
  62. };
  63. ')
  64.  
  65.  
  66. dnl
  67. dnl
  68. dnl
  69. define(`_PCC_CLASS_IMPLEMENTATION_INTERFACE',`dnl
  70. const Glib::Interface_Class& __CPPNAME__`'_Class::init()
  71. {
  72.   if(!gtype_) // create the GType if necessary
  73.   {
  74.     // Glib::Interface_Class has to know the interface init function
  75.     // in order to add interfaces to implementing types.
  76.     class_init_func_ = &__CPPNAME__`'_Class::iface_init_function;
  77.  
  78.     // We can not derive from another interface, and it is not necessary anyway.
  79.     gtype_ = _LOWER(__CCAST__)_get_type();
  80.   }
  81.  
  82.   return *this;
  83. }
  84.  
  85. void __CPPNAME__`'_Class::iface_init_function(void* g_iface, void*)
  86. {
  87.   BaseClassType *const klass = static_cast<BaseClassType*>(g_iface);
  88.  
  89.   //This is just to avoid an "unused variable" warning when there are no vfuncs or signal handlers to connect.
  90.   //This is a temporary fix until I find out why I can not seem to derive a GtkFileChooser interface. murrayc
  91.   g_assert(klass != 0); 
  92.  
  93. _IMPORT(SECTION_PCC_CLASS_INIT_VFUNCS)
  94. _IMPORT(SECTION_PCC_CLASS_INIT_DEFAULT_SIGNAL_HANDLERS)
  95. }
  96.  
  97. _IMPORT(SECTION_PCC_VFUNCS)
  98.  
  99. _IMPORT(SECTION_PCC_DEFAULT_SIGNAL_HANDLERS)
  100. ')
  101.  
  102.  
  103. dnl
  104. dnl _END_CLASS_INTERFACE()
  105. dnl   denotes the end of a class
  106. dnl
  107. define(`_END_CLASS_INTERFACE',`
  108. _SECTION(SECTION_HEADER1)
  109. _STRUCT_PROTOTYPE()
  110.  
  111. __NAMESPACE_BEGIN__ class __CPPNAME__`'_Class; __NAMESPACE_END__
  112. _SECTION(SECTION_HEADER3)
  113.  
  114. ifdef(`__BOOL_NO_WRAP_FUNCTION__',`dnl
  115. ',`dnl
  116. namespace Glib
  117. {
  118.   /** @relates __NAMESPACE__::__CPPNAME__
  119.    * @param object The C instance
  120.    * @param take_copy False if the result should take ownership of the C instance. True if it should take a new copy or ref.
  121.    * @result A C++ instance that wraps this C instance.
  122.    */
  123.   Glib::RefPtr<__NAMESPACE__::__CPPNAME__> wrap(__CNAME__`'* object, bool take_copy = false);
  124.  
  125. } // namespace Glib
  126.  
  127. ')dnl
  128. dnl
  129. dnl
  130. _SECTION(SECTION_PHEADER)
  131.  
  132. #include <glibmm/private/interface_p.h>
  133.  
  134. __NAMESPACE_BEGIN__
  135.  
  136. _PH_CLASS_DECLARATION_INTERFACE()
  137.  
  138. __NAMESPACE_END__
  139.  
  140. _SECTION(SECTION_SRC_GENERATED)
  141.  
  142. ifdef(`__BOOL_NO_WRAP_FUNCTION__',`dnl
  143. ',`dnl else
  144. namespace Glib
  145. {
  146.  
  147. Glib::RefPtr<__NAMESPACE__::__CPPNAME__> wrap(__CNAME__`'* object, bool take_copy)
  148. {
  149.   return Glib::RefPtr<__NAMESPACE__::__CPPNAME__>( dynamic_cast<__NAMESPACE__::__CPPNAME__*> (Glib::wrap_auto ((GObject*)(object), take_copy)) );
  150.   //We use dynamic_cast<> in case of multiple inheritance.
  151. }
  152.  
  153. } // namespace Glib
  154. ')dnl endif
  155.  
  156.  
  157. __NAMESPACE_BEGIN__
  158.  
  159.  
  160. /* The *_Class implementation: */
  161.  
  162. _PCC_CLASS_IMPLEMENTATION_INTERFACE()
  163.  
  164. Glib::ObjectBase* __CPPNAME__`'_Class::wrap_new(GObject* object)
  165. {
  166.   return new __CPPNAME__`'((__CNAME__*)`'(object));
  167. }
  168.  
  169.  
  170. /* The implementation: */
  171.  
  172. __CPPNAME__::__CPPNAME__`'()
  173. :
  174.   Glib::Interface(__BASE__`'_class_.init())
  175. {}
  176.  
  177. __CPPNAME__::__CPPNAME__`'(__CNAME__* castitem)
  178. :
  179.   __CPPPARENT__`'(__PCAST__`'(castitem))
  180. {}
  181.  
  182. __CPPNAME__::~__CPPNAME__`'()
  183. {}
  184.  
  185. // static
  186. void __CPPNAME__`'::add_interface(GType gtype_implementer)
  187. {
  188.   __BASE__`'_class_.init().add_interface(gtype_implementer);
  189. }
  190.  
  191. _CC_CLASS_IMPLEMENTATION()
  192.  
  193. __NAMESPACE_END__
  194.  
  195. dnl
  196. dnl
  197. dnl
  198. dnl
  199. _POP()
  200. dnl
  201. dnl The actual class, e.g. Gtk::Widget, declaration:
  202. dnl _IMPORT(SECTION_H_SIGNALPROXIES_CUSTOM)
  203.  
  204. _IMPORT(SECTION_CLASS1)
  205.  
  206. #ifndef DOXYGEN_SHOULD_SKIP_THIS
  207.  
  208. public:
  209.   typedef __CPPNAME__ CppObjectType;
  210.   typedef __CPPNAME__`'_Class CppClassType;
  211.   typedef __CNAME__ BaseObjectType;
  212.   typedef __CCLASS__ BaseClassType;
  213.  
  214. private:
  215.   friend class __CPPNAME__`'_Class;
  216.   static CppClassType `'__BASE__`'_class_;
  217.  
  218.   // noncopyable
  219.   __CPPNAME__`'(const __CPPNAME__&);
  220.   __CPPNAME__& operator=(const __CPPNAME__&);
  221.  
  222. protected:
  223.   __CPPNAME__`'(); // you must derive from this class
  224.   explicit __CPPNAME__`'(__CNAME__* castitem);
  225.  
  226. #endif /* DOXYGEN_SHOULD_SKIP_THIS */
  227.  
  228. public:
  229.   virtual ~__CPPNAME__`'();
  230.  
  231.   static void add_interface(GType gtype_implementer);
  232.  
  233. #ifndef DOXYGEN_SHOULD_SKIP_THIS
  234.   static GType get_type()      G_GNUC_CONST;
  235.   static GType get_base_type() G_GNUC_CONST;
  236. #endif
  237.  
  238.   ///Provides access to the underlying C GObject.
  239.   __CNAME__*       gobj()       { return reinterpret_cast<__CNAME__*>(gobject_); }
  240.  
  241.   ///Provides access to the underlying C GObject.  
  242.   const __CNAME__* gobj() const { return reinterpret_cast<__CNAME__*>(gobject_); }
  243.  
  244. private:
  245. _IMPORT(SECTION_CLASS2)
  246.  
  247. public:
  248. _H_VFUNCS_AND_SIGNALS()
  249.  
  250. ')
  251.  
  252.